/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controller.util;

import Entidades.Preguntas;
import Entidades.Usuarios;
import Sesion.UsuariosFacade;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import org.primefaces.context.RequestContext;

/**
 * Esta clase define el flujo de los recursos, permite modificar el
 * comportamiento de los componentes y Acceder a través de ellos por medio de la
 * vista
 *
 * @author: Didier Correa
 * @version: 21/10/2014
 */
@ManagedBean(name = "Login")
@SessionScoped
public class Login {
/**
     *
     * Objetos definidos de clase, permite obtener la instancia de los recursos
     * utilizados en el controlador
     *
     */
    @EJB
    private UsuariosFacade ejbUsuarioFacade;
    public static String username;
    private String pregunta;
    private String respuesta;
    private boolean logeado = false;
    private boolean administrador;
    private boolean usuario;
    private Preguntas preguntaObjeto;
    private LoginPermisos loginPermisos;
    private String name;
/**
     *
     * Método encargado de retornar la instancia de un objeto
     *
     * @return instancia del objeto seleccionado
     *
     */
    public Preguntas getPreguntaObjeto() {
        return preguntaObjeto;
    }
/**
     *
     * Método encargado de retornar la instancia de un objeto
     *
     * @return instancia del objeto seleccionado
     *
     */
    public void setPreguntaObjeto(Preguntas preguntaObjeto) {
        this.preguntaObjeto = preguntaObjeto;
    }
/**
     *
     * Método encargado de retornar la instancia de un objeto
     *
     * @return instancia del objeto seleccionado
     *
     */
    public boolean isUsuario() {
        return usuario;
    }
/**
     *
     * Método encargado de retornar la instancia de un objeto
     *
     * @return instancia del objeto seleccionado
     *
     */
    public void setUsuario(boolean usuario) {
        this.usuario = usuario;
    }
/**
     *
     * Método encargado de retornar la instancia de un objeto
     *
     * @return instancia del objeto seleccionado
     *
     */
    public boolean isAdministrador() {
        return administrador;
    }
/**
     *
     * Método encargado de retornar la instancia de un objeto
     *
     * @return instancia del objeto seleccionado
     *
     */
    public boolean estaLogeado() {
        return logeado;
    }
    /**
     *
     * Método encargado de retornar la instancia de un objeto
     *
     * @return instancia del objeto seleccionado
     *
     */
    private String password;
/**
     *
     * Método que devuelve un String para el direccionamiento hacia el
     * formulario de creación e inicializa la instancia del controlador
     *
     * @return Una cadena de dirección
     *
     */
    public String getUsername() {
        return username;
    }
/**
     *
     * Método que devuelve un String para el direccionamiento hacia el
     * formulario de creación e inicializa la instancia del controlador
     *
     * @return Una cadena de dirección
     *
     */
    public void setUsername(String username) {
        this.username = username;
    }
/**
     *
     * Método que devuelve un String para el direccionamiento hacia el
     * formulario de creación e inicializa la instancia del controlador
     *
     * @return Una cadena de dirección
     *
     */
    public String getPregunta() {
        return pregunta;
    }
/**
     *
     * Método que devuelve un String para el direccionamiento hacia el
     * formulario de creación e inicializa la instancia del controlador
     *
     * @return Una cadena de dirección
     *
     */
    public void setPregunta(String pregunta) {
        this.pregunta = pregunta;
    }
/**
     *
     * Método que devuelve un String para el direccionamiento hacia el
     * formulario de creación e inicializa la instancia del controlador
     *
     * @return Una cadena de dirección
     *
     */
    public String getRespuesta() {
        return respuesta;
    }
/**
     *
     * Método que devuelve un String para el direccionamiento hacia el
     * formulario de creación e inicializa la instancia del controlador
     *
     * @return Una cadena de dirección
     *
     */
    public void setRespuesta(String respuesta) {
        this.respuesta = respuesta;
    }
/**
     *
     * Método que devuelve un String para el direccionamiento hacia el
     * formulario de creación e inicializa la instancia del controlador
     *
     * @return Una cadena de dirección
     *
     */
    public String getPassword() {
        return password;
    }
/**
     *
     * Método que devuelve un String para el direccionamiento hacia el
     * formulario de creación e inicializa la instancia del controlador
     *
     * @return Una cadena de dirección
     *
     */
    public void setPassword(String password) {
        this.password = password;
    }
/**
     *
     * Método que devuelve un String para el direccionamiento hacia el
     * formulario de creación e inicializa la instancia del controlador
     *
     * @return Una cadena de dirección
     *
     */
    public void loginUsuario() {

        List<Usuarios> listaUsuario = ejbUsuarioFacade.login(username, password);
        RequestContext context = RequestContext.getCurrentInstance();

        if (!listaUsuario.isEmpty()) {

            JsfUtil.addSuccessMessage("Bienvenido al sistema");
            logeado = true;
            
            name = listaUsuario.get(0).getPerfil().getNombre();
            usuario = listaUsuario.get(0).getPerfil().getId() == 2;
            //Iniciar permisos
            loginPermisos = new LoginPermisos(listaUsuario.get(0).getPerfil().getPermisos());

        } else {

            logeado = false;
            JsfUtil.addErrorMessage("Datos Invalidos");

        }
        context.addCallbackParam("estaLogeado", logeado);
        if (logeado) {
            context.addCallbackParam("view", "menu.xhtml");
        }

    }
/**
     *
     * Método que devuelve un String para el direccionamiento hacia el
     * formulario de creación e inicializa la instancia del controlador
     *
     * @return Una cadena de dirección
     *
     */
    public String logout() {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
                .getExternalContext().getSession(false);
        session.invalidate();
        logeado = false;
        return "login";
    }
/**
     *
     * Método que devuelve un String para el direccionamiento hacia el
     * formulario de creación e inicializa la instancia del controlador
     *
     * @return Una cadena de dirección
     *
     */
    public void recuperarClave() {

        List<Usuarios> listaUsuario = new ArrayList<Usuarios>();
        try {
            listaUsuario = ejbUsuarioFacade.recuperar(username, preguntaObjeto.getId() + "", respuesta);
        } catch (Exception n) {
            n.printStackTrace();
        }
        if (!listaUsuario.isEmpty()) {
            for (Usuarios usuario : listaUsuario) {
                new Controller.util.EnviarMailHtml("gimnasioextrem@gmail.com", "ppitecnologia",
                        usuario.getCorreo(), "Recuperacion de clave", Controller.util.ValoresConstantes.correoRecuperarHMTL(usuario));

            }

            JsfUtil.addSuccessMessage("Su informacion ha sido enviada al correo asociado a la cuenta.");
        } else {
            JsfUtil.addSuccessMessage("la pregunta y la respuesta no concuerdan con el usuario. por favor verifique");
        }
    }

    /**
     * Metodo accesor de los permisos
     *
     * @return
     */
    public LoginPermisos getLoginPermisos() {
        return loginPermisos;
    }

    /**
     * Metodo para asignar los permisos
     *
     * @param loginPermisos
     */
    public void setLoginPermisos(LoginPermisos loginPermisos) {
        this.loginPermisos = loginPermisos;
    }

    /**
     * Metodo accesor del nomber del perfil
     *
     * @return
     */
    public String getName() {
        return name;
    }

    /**
     * Metodo para asignar el nombre del perfil
     *
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

}
